package com.yuews.template;

import java.util.function.Supplier;

public class Main {

    public static void main(String[] args) {
        //有一个功能用来保存不同的参数，但是保存参数前需要做一些动作，保存参数后需要做一些动作。只有中间的动作不同，其他动作相同，
        operation1();
        operation2();
        System.out.println("--------------------------------------------------");
        //我们发现有很多重复的代码 如何优化呢？
        // 请看DataOperationTemplate.java 使用了模板模式解决这个问题
        new Operation1Impl().executeOperation();
        new Operation2Impl().executeOperation();
        System.out.println("--------------------------------------------------");
        //这是基于类的公用方法抽取操作
        // 还有另一种Java8开始支持的函数式接口 有调用者去实现具体的业务逻辑
        operation(()-> {
            System.out.println("我是定制的保存数据操作1");
            return null;
        });
        operation(()-> {
            System.out.println("我是定制的保存数据操作2");
            return null;
        });
        //当然也可以用Spring的AOP来做切面，但是只是写一些原生的代码，不涉及到框架层，这里就不介绍了

    }

    public static void operation(Supplier<String> supplier){
        System.out.println("保存参数前需要做一些动作");
        supplier.get();
        System.out.println("保存参数后一些动作");
    }

    public static void operation1(){
        System.out.println("保存参数前需要做一些动作");
        System.out.println("我是定制的保存数据操作1");
        System.out.println("保存参数后的一些动作");
    }


    public static void operation2(){
        System.out.println("保存参数前需要做一些动作");
        System.out.println("我是定制的保存数据操作2");
        System.out.println("保存参数后的一些动作");
    }
}
